﻿using System.Collections.Generic; // 引入泛型集合命名空间，例如 List<T>
using UnityEngine;             // Unity 核心库
using UnityEngine.Rendering;   // Unity 渲染相关功能，包括 ScriptableRenderContext, Camera 等

// 自定义渲染管线类，继承自 Unity 的 RenderPipeline 基类
// 这是你实现 SRP（可编程渲染管线 / Scriptable Render Pipeline）逻辑的核心类
public class CustomRenderPipeline : RenderPipeline
{
	// 创建一个 CameraRenderer 实例，用于实际渲染单个相机的内容
	// 通常 CameraRenderer 是你自己定义的一个工具类，封装了渲染一整个相机（比如不透明物体、天空盒、透明物体等）的逻辑
	CameraRenderer renderer = new CameraRenderer();

	// 🔒 注意：此方法是 RenderPipeline 的一个重载，接收 Camera[] 数组形式参数
	// 但在 Unity 的较新版本中（如使用 URP 或 SRP Core），更常用的是接收 List<Camera> 的重载
	// 所以此处我们留空，不进行任何操作（或者可以标记为 [Obsolete] 提醒不要使用）
	protected override void Render(
		ScriptableRenderContext context, Camera[] cameras
	)
	{
		// ⚠️ 此重载已弃用或不推荐使用（取决于 Unity 版本）
		// 如果你调用了这个方法，这里可以什么都不做，或者输出警告日志
		// 当前我们选择留空，因为下面有另一个更常用的重载方法

		// 如果你想兼容旧代码，也可以在这里遍历 cameras[] 并调用 renderer.Render(...)
		// 但目前我们主要使用下面的 List<Camera> 版本
	}

	// ✅ 这是我们实际使用的主要渲染方法
	// Unity 在运行时会针对每一帧中的每一个需要渲染的相机，调用这个方法
	// 参数说明：
	// - context: ScriptableRenderContext，用于提交渲染指令给 GPU 的上下文对象
	// - cameras: List<Camera>，当前帧中需要渲染的所有相机列表
	protected override void Render(
		ScriptableRenderContext context, List<Camera> cameras
	)
	{
		// 遍历所有需要渲染的相机
		for (int i = 0; i < cameras.Count; i++)
		{
			// 对每一个相机，调用 CameraRenderer 的 Render 方法
			// 该方法内部通常会做以下事情（取决于你的 CameraRenderer 实现）：
			// 1. 准备渲染目标（如设置 Camera 的 Render Target）
			// 2. 设置渲染视口、投影矩阵等
			// 3. 执行 CommandBuffer 渲染命令
			// 4. 绘制不透明物体、天空盒、透明物体等
			renderer.Render(context, cameras[i]);
		}
	}
}